Powershell scripts/Enable AMA Auto Provisioning/enable-amaDefender4Servers.ps1 (111 lines of code) (raw):

<# .DESCRIPTION This script will enable auto provisioning of the Azure Monitor Agent for Defender for Servers .PARAMETER subscriptionId The id of the subscription to enable Defender for Servers AMA on. .PARAMETER workspaceResourceId The full workspace resource ID for using a custom workspace. This paramater is optional, if not specified the default workspace will be used. .PARAMETER managementGroupName The Management Group Name to enable Defender for Servers AMA on. Note, the Tenant Root Group management group name is acutally a GUID and not "Tenant Root Group" .EXAMPLE Enable Auto-provisioning configuration for AMA with the default workspace .\enable-amaDefender4Servers.ps1 -subscriptionId 'ada06e68-4678-4210-443a-c6cacebf41c5' .EXAMPLE Enable Auto-provisioning configuration for AMA with a custom workspace .\enable-amaDefender4Servers.ps1 -subscriptionId 'ada06e68-4678-4210-443a-c6cacebf41c5' -workspaceResourceId '/subscriptions/11c61180-d5dc-4a02-b2da-1f06b8245691/resourcegroups/sentinel-prd/providers/microsoft.operationalinsights/workspaces/sentinel-prd' .EXAMPLE Enable Auto-provisioning configuration for AMA with the default workspace on a management group .\enable-amaDefender4Servers.ps1 -managementGroupName 'Finance' #> param( [Parameter(ValueFromPipeline = $true, Mandatory=$true, ParameterSetName = 'sub')] [string]$subscriptionId, [Parameter(Mandatory = $false)] [string]$workspaceResourceId, [Parameter(Mandatory = $false, ParameterSetName = 'mg')] [string]$managementGroupName ) # Check for required modules $requiredModules = 'Az.Accounts', 'Az.Resources', 'Az.Security', 'Az.PolicyInsights' $availableModules = Get-Module -ListAvailable -Name $requiredModules $modulesToInstall = $requiredModules | where-object {$_ -notin $availableModules.Name} ForEach ($module in $modulesToInstall){ Write-Host "Installing Missing PowerShell Module: $module" -ForegroundColor Yellow Install-Module $module -force } If(!(Get-AzContext)){ Write-Host 'Connecting to Azure Subscription' -ForegroundColor Yellow Connect-AzAccount -Subscription $subscriptionId -WarningAction SilentlyContinue | Out-Null } If ($managementGroupName){ # Get all child managment groups and subscriptions $mg = Get-AzManagementGroup -GroupName $managementGroupName -Recurse -Expand -WarningAction SilentlyContinue $mgSubs = Get-AzManagementGroupSubscription -GroupName $managementGroupName -WarningAction SilentlyContinue ForEach ($childMG in ($mg.Children | where Type -eq 'Microsoft.Management/managementGroups')){ $mgSubs += Get-AzManagementGroupSubscription -GroupName $childMG.Name -WarningAction SilentlyContinue } # Disable Existing Legacy Log Analytics Auto Provisioning Settings ForEach ($mgSub in $mgSubs){ $currentSub = Set-AzContext -Subscription $mgSub.DisplayName Write-Host ('Disabling Existing Legacy Log Analytics Auto Provisioning Settings on Subscription:', $currentSub.Subscription.Name) Set-AzSecurityAutoProvisioningSetting -Name "default" | Out-Null } # Policy Assignment Scope $scope = $mg.Id }else{ # Set Current Subscription $currentSub = Set-AzContext -Subscription $subscriptionId # Disable Existing Legacy Log Analytics Auto Provisioning Settings Write-Host ('Disabling Existing Legacy Log Analytics Auto Provisioning Settings on Subscription:', $currentSub.Subscription.Name) Set-AzSecurityAutoProvisioningSetting -Name "default" | Out-Null # Policy Assignment Scope $scope = "/subscriptions/$($currentSub.Subscription.Id)" } # Policy Description $description = 'This policy assignment was automatically created by Azure Security Center for agent installation as configured in Security Center auto provisioning.' If ($workspaceResourceId){ $definition = Get-AzPolicySetDefinition -Id '/providers/Microsoft.Authorization/policySetDefinitions/500ab3a2-f1bd-4a5a-8e47-3e09d9a294c3' $displayName = 'Custom Defender for Cloud provisioning Azure Monitor agent' $paramSet = @{ Name = $(New-Guid).Guid.substring(0,23) DisplayName = $displayName Description = $description PolicySetDefinition = $definition IdentityType = 'SystemAssigned' Location = 'centralus' Scope = $scope PolicyParameterObject = @{ userWorkspaceResourceId = $workspaceResourceId workspaceRegion = (Get-AzResource -ResourceId $workspaceResourceId).Location } } }Else{ $definition = Get-AzPolicySetDefinition -Id '/providers/Microsoft.Authorization/policySetDefinitions/362ab02d-c362-417e-a525-45805d58e21d' $displayName = 'Default Defender for Cloud provisioning Azure Monitor agent' $paramSet = @{ Name = $(New-Guid).Guid.substring(0,23) DisplayName = $displayName Description = $description PolicySetDefinition = $definition IdentityType = 'SystemAssigned' Location = 'centralus' Scope = $scope } } # Create the Policy Assignment Write-Host ('Creating policy assignment {0} on {1}' -f $paramSet.DisplayName, $paramSet.Scope) $assignment = New-AzPolicyAssignment @paramSet -WarningAction SilentlyContinue # Create Role Assignments for the system managed identity $roles = @() ForEach ($PolicyDefinition in $definition.Properties.PolicyDefinitions){ $roles += ((Get-AzPolicyDefinition -Id $PolicyDefinition.policyDefinitionId).properties.policyRule.then.details.roleDefinitionIds -split "/")[-1] } ForEach ($role in ($roles | Get-Unique)){ Write-Host ('Creating {0} role assignment for remmedition on: {1}' -f $role, $scope) New-AzRoleAssignment -Scope $scope -ObjectId $assignment.Identity.PrincipalId -RoleDefinitionId $role -ErrorAction SilentlyContinue | Out-Null } # Create Remmediation Tasks Write-Host 'Creating Remmediation Tasks' ForEach ($PolicyDefinition in $definition.Properties.PolicyDefinitions){ Start-AzPolicyRemediation -Name $PolicyDefinition.policyDefinitionReferenceId -PolicyAssignmentId $assignment.PolicyAssignmentId -PolicyDefinitionReferenceId $PolicyDefinition.policyDefinitionReferenceId -ParallelDeploymentCount 30 -ResourceDiscoveryMode ReEvaluateCompliance | Out-Null }